什么是反向代理?反向代理服務(wù)器是位于后端服務(wù)器前面的中間連接點,它將客戶端請求路由到這些服務(wù)器,并確保沒有客戶端直接與后端通信。這與轉(zhuǎn)發(fā)代理不同,在轉(zhuǎn)發(fā)代理中,代理位于客戶端前面,并充當(dāng)客戶端和源服務(wù)器之間的中介。反向代理就像一個實際的端點,為您的系統(tǒng)提供額外的安全和控制層。
有哪些反向代理用例?
反向代理是基本的系統(tǒng)管理概念之一,可以幫助您提高系統(tǒng)的可伸縮性、性能、彈性和安全性。讓我們來看看一些最流行的反向代理用例。
- 負(fù)載平衡。反向代理可以充當(dāng)負(fù)載平衡器,在不同服務(wù)器池之間分配傳入請求。它可能使用循環(huán)法、最少連接數(shù)、最少響應(yīng)時間或其他一些算法來路由傳入請求并使您的整個系統(tǒng)更快、更有彈性。如果服務(wù)器出現(xiàn)故障,您的反向代理負(fù)載平衡器會將流量重定向到其余的在線服務(wù)器。
- 匿名。反向代理在將所有請求傳輸?shù)胶蠖朔?wù)器之前攔截所有請求。這樣你的后端服務(wù)器永遠(yuǎn)不需要透露他們的 IP 地址,只能通過反向代理訪問,這使得直接攻擊它們變得更加困難。
- 交通清洗。反向代理服務(wù)器可能安裝了一些流量控制機(jī)制來過濾惡意或不需要的請求并防止它們到達(dá)您的后端服務(wù)。您可以使用防火墻、防病毒系統(tǒng)或任何其他應(yīng)用程序內(nèi)容檢查機(jī)制來加強(qiáng)系統(tǒng)安全性。
- 緩存。反向代理服務(wù)器可以存儲經(jīng)常訪問的靜態(tài)或動態(tài) Web 內(nèi)容,以更快地提供服務(wù)并減輕后端服務(wù)器的負(fù)載。
- SSL 加密。加密和解密 TLS 流量的計算量很大。反向代理可以負(fù)責(zé) SSL 加密,以減輕后端服務(wù)器的工作負(fù)擔(dān)。
- 內(nèi)容壓縮。使用反向代理,您可以壓縮入站和出站數(shù)據(jù),使客戶端和后端服務(wù)器之間的通信更快。
- A/B 測試。A/B 測試可以在瀏覽器、Web 應(yīng)用程序或后端層上執(zhí)行。使用反向代理,您可以實施后端層 A/B 測試并將傳入流量隨機(jī)分配到運行不同版本應(yīng)用程序的服務(wù)器。
先決條件
在我們開始之前,您需要:
- 使用 sudo 權(quán)限訪問 Linux 服務(wù)器。我們將使用 Ubuntu 20.04,但您可以選擇不同的發(fā)行版。
- 指向您的服務(wù)器 IP 地址的域名,用于配置 SSL 證書。您可以使用每臺服務(wù)器免費提供的自定義 Cherry Servers 子域名。
安裝阿帕奇
在本指南中,我們將使用 Apache Web 服務(wù)器來創(chuàng)建反向代理的工作概念。Apache 帶有一些方便的擴(kuò)展模塊,支持反向代理解決方案。
首先,連接到您的服務(wù)器并從 APT 存儲庫更新本地包索引:
sudo apt update
現(xiàn)在讓我們apache2從官方 Ubuntu 20.04 存儲庫安裝軟件包:
sudo apt install -y apache2
安裝完成后,您可以通過檢查其版本來驗證 Apache 是否已安裝:
apache2 -version
也可以apache2使用以下命令檢查狀態(tài):
sudo systemctl status apache2
如您所見,apache2 在您安裝后立即處于活動狀態(tài)并正在運行。您可以通過請求默認(rèn)的 Apache 索引頁面來執(zhí)行抽查以驗證它是否按預(yù)期工作。只需在網(wǎng)絡(luò)瀏覽器中輸入服務(wù)器的 IP 地址,然后按回車鍵:
如果您不知道自己的 IP 地址,請使用以下命令獲取它:
hostname -I
此命令將顯示計算機(jī)上可用的所有網(wǎng)絡(luò)接口上的所有已配置 IP 地址,包括公共網(wǎng)絡(luò)接口的 IP 地址。
為反向代理啟用 Apache 模塊
要將反向代理與 Apache Web Server 一起使用,您需要啟用特定的 Apache 模塊以支持反向代理服務(wù)器所需的附加功能。我們的場景需要以下模塊:
- mod_proxy:它是 Apache 的主要代理模塊,用于管理連接和重定向它們。它允許 Apache 充當(dāng)?shù)讓雍蠖朔?wù)器的網(wǎng)關(guān)。該模塊對于所有反向代理場景都是必需的。
- mod_proxy_http:此模塊依賴于 mod_proxy 并且需要支持對代理服務(wù)器的 HTTP 和 HTTPS 請求。
- mod_ssl:該模塊為 Apache HTTP 服務(wù)器提供 SSL v3 和 TLS v1.x 協(xié)議支持。
現(xiàn)在讓我們使用a2enmod命令啟用這些模塊:
sudo a2emod proxy && sudo a2enmod proxy_http && a2enmod ssl
每次啟用新的 Apache 模塊時,不要忘記重新啟動 apache2 服務(wù)器:
sudo systemctl restart apache2
您可以使用以下命令驗證這些模塊是否處于活動狀態(tài):
apache2ctl -M
配置 Apache 反向代理
現(xiàn)在是時候配置 Apache 反向代理以接受來自 Internet 的請求并將它們轉(zhuǎn)發(fā)到您選擇的資源。您可以將反向代理請求轉(zhuǎn)發(fā)到任何您想要的地方,包括其他服務(wù)器,但我們將使用本地網(wǎng)絡(luò)用于教育目的。
000-default.conf首先,讓我們使用以下命令禁用默認(rèn)的 Apache 虛擬主機(jī)配置文件:
sudo a2dissite 000-default.conf
現(xiàn)在使用以下配置文本cherry.conf在目錄中創(chuàng)建一個新的虛擬主機(jī)配置文件:/etc/apache2/sites-available
<VirtualHost *:80> ServerName site1.com ServerAlias www.site1.com ServerAdmin postmaster@site1.com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyRequests Off </VirtualHost>
<VirtualHost>我們使用包含 IP 地址和 Apache 為該虛擬主機(jī)接受的端口號的命令開始我們的配置文件。在這種情況下使用元字符*,因為所有 IP 地址都被接受,而端口號80代表默認(rèn)的 HTTP 端口。配置繼續(xù)以下項目:
- ServerName:定義與服務(wù)器關(guān)聯(lián)的域名。/etc/hosts如果您想通過關(guān)聯(lián)的域名訪問您的服務(wù)器,您可以通過 DNS 在 Internet 上配置它或通過文件在本地設(shè)置它。
- ServerAlias:允許您定義將被服務(wù)器接受的其他名稱。
- ServerAdmin:服務(wù)器在返回給客戶端的錯誤消息中包含的聯(lián)系人電子郵件地址。
- ErrorLog:設(shè)置 Apache 用來存儲它遇到的任何錯誤的文件的名稱。
- CustomLog:設(shè)置 Apache 用于將客戶端請求記錄到服務(wù)器的文件的名稱。
- ProxyPass:將遠(yuǎn)程服務(wù)器映射到本地服務(wù)器的空間。定義流量重定向的目標(biāo)地址。
- ProxyPassReverse:代理服務(wù)器不僅可以接收請求,還可以將響應(yīng)數(shù)據(jù)包轉(zhuǎn)發(fā)回客戶端。命令用代理服務(wù)器的信息重寫后端服務(wù)器的ProxyPassReverse原始location和HTTP 響應(yīng)標(biāo)頭。這對于避免繞過反向代理并將后端服務(wù)器與 Internet 隔離至關(guān)重要。content-locationuri
- ProxyRequests:防止 Apache HTTP 服務(wù)器被用作轉(zhuǎn)發(fā)代理并使其更安全。ProxyRequests使用時通常應(yīng)將該命令設(shè)置為關(guān)閉ProxyPass。
保存配置文件并使用以下命令啟用新的虛擬主機(jī):
sudo a2ensite cherry.conf
配置完成后,不要忘記重新啟動 apache2 以激活更改:
sudo systemctl restart apache2
配置 Flask 應(yīng)用程序
您的反向代理配置現(xiàn)已完成,但我們?nèi)匀蝗鄙僖粋€將在端口 8080 上偵聽的 Web 應(yīng)用程序,因為我們的ProxyPass指令將傳入請求轉(zhuǎn)發(fā)到此目的地。
為此,我們可以使用一個簡單的 Flask 應(yīng)用程序。讓我們先安裝 python3 和 pip 包管理器:
sudo apt install python3 python3-pip
安裝完成后,繼續(xù)通過pip安裝Flask:
pip3 install flask
現(xiàn)在我們準(zhǔn)備創(chuàng)建一個簡單的 Flask Web 應(yīng)用程序。讓我們稱之為app.py:
vim app.py
在下面的 Python 代碼中,我們導(dǎo)入 Flask 庫,實例化 Flask 應(yīng)用程序并在“/”路由上調(diào)用 index() 函數(shù):
from flask import Flask app = Flask(__name__) @app.route(“/”) def index(): return “Apache reverse proxy is working!”
將 Python 腳本保存在您的工作目錄中,并將 FLASK_APP 環(huán)境變量設(shè)置為 app.py,以便 Flask 知道在哪里實例化您的 Web 應(yīng)用程序:
FLASK_APP=app.py
現(xiàn)在您已準(zhǔn)備好運行您的 Flask 應(yīng)用程序。讓我們通過將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出重定向到文件來作為后臺作業(yè)在端口 8080 上運行它/dev/null以保持我們的終端清潔:
flask run --port=8080 > /dev/null 2 > &1 &
現(xiàn)在打開瀏覽器并嘗試通過標(biāo)準(zhǔn) HTTP 80 端口連接到您的 IP 地址:
您剛剛向 IP 地址上的端口 80 發(fā)送了一個 HTTP GET 請求,并且您的請求已被 Apache 反向代理轉(zhuǎn)發(fā)到端口 8080,您的 Flask 應(yīng)用程序在此處發(fā)回響應(yīng)。恭喜,您的 Apache 反向代理配置正在運行!
配置 SSL 證書
通常,您希望對您的應(yīng)用程序流量進(jìn)行 SSL 加密。您可以使用免費的 Let's Encrypt TLS 證書使用 Apache 反向代理配置 SSL/TLS 加密。
首先,安裝允許您自動頒發(fā)和安裝證書的 Certbot ACME 客戶端:
sudo apt install certbot
接下來,為 Certbot 安裝 Apache 插件以簡化安裝過程:
sudo apt install python3-certbot-apache
Let's Encrypt 不會為沒有域名的服務(wù)器頒發(fā) TLS 證書。要繼續(xù)配置證書,您需要從任何域名提供商處購買域名并將其指向您服務(wù)器的 IP 地址。或者,您可以使用自定義 DNS 名稱,該名稱可以在 Cherry Servers 為每臺服務(wù)器設(shè)置。
為此,請轉(zhuǎn)到您的客戶端,訪問服務(wù)器的網(wǎng)絡(luò)選項,然后按管理 IP 上的“編輯地址”按鈕:
您現(xiàn)在可以輸入自定義 DNS 名稱并按更新:
這樣做之后,子域名reverse-proxy.cloud.cherryservers.net將可用于您的服務(wù)器。您現(xiàn)在可以使用此子域名而不是 IP 地址來查詢它:
您還應(yīng)該將此子域名添加到您的 cherry.conf 配置文件中:
<VirtualHost *:80> ServerName cherry.com ServerAlias www.cherry.com reverse-proxy.cloud.cherryservers.net […] </VirtualHost>
現(xiàn)在您可以使用以下命令開始 TLS 證書配置:
sudo certbot --apache
首先,您將被要求輸入您將接收續(xù)訂和安全通知的電子郵件地址:
接下來,您需要閱讀并同意 Let's Encrypt 服務(wù)條款:
決定您是否愿意接收來自 Let's Encrypt 的新聞和產(chǎn)品更新:
Certbot 將自動從您的 Apache 虛擬主機(jī)配置文件中讀取 ServerName 和 ServerAlias 變量。選擇要用于 HTTPS 查詢的正確域名并繼續(xù)安裝:
Certbot 現(xiàn)在將為 SSL 連接創(chuàng)建一個新的 Apache 虛擬主機(jī)并為您生成證書。
最后,系統(tǒng)會詢問您是否要自動將所有 HTTP 流量重定向到 HTTPS。為了簡單起見,選擇No redirect:
就是這樣——您現(xiàn)在擁有一個功能齊全的 Apache 反向代理,帶有 SSL 加密!您現(xiàn)在可以通過安全的 HTTPS 連接訪問您的 Web 代理服務(wù)器:
?專業(yè)提示:您可以通過在一行中使用 Certbot 和一些強(qiáng)制參數(shù)來進(jìn)一步簡化 TLS 證書安裝:
sudo certbot --apache --non-interactive --agree-tos -m mantas.levinas@cherryservers.com -d reverse-proxy.cloud.cherryservers.net
如果您想更深入地了解 Certbot 做了什么,請隨時查看新創(chuàng)建的 Apache 虛擬主機(jī):
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName cherry.com ServerAlias www.cherry.com reverse-proxy.cloud.cherryservers.net ServerAdmin mantas.levinas@cherryserers.com ErrorLog ${APACHE_LOG_DIR}/erro.log CustomLog ${APACHE_LOG_DIR}/access.log combined ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyRequests Off SSLCertificateFile /etc/letsencrypt/live/reverse-proxy.cloud.cherryservers.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/reverse-proxy.cloud.cherryservers.net/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>
您可以看到 Apache 檢查您是否有可用的 mod_ssl,如果有,它會使用給定的虛擬主機(jī)配置來接受通常為 HTTPS 流量保留的端口 443 上的所有 IP 地址。
虛擬主機(jī)幾乎是我們原始配置的副本,cherry.conf但多了三行。它包括對 SSL 證書文件的引用并導(dǎo)入 SSL 配置文件以使用一些必需的 SSL 設(shè)置來補(bǔ)充您的虛擬主機(jī)配置。
結(jié)論
在本文中,我們了解了什么是反向代理及其使用方法。我們還建立了 Apache 反向代理的工作概念,使用 SSL 加密來提供額外的安全層。您可以使用 Apache Web Server 構(gòu)建更多的反向代理用例,所以請不要猶豫,在Apache 官方文檔頁面上了解更多關(guān)于這個基本系統(tǒng)工程概念的信息。